#include <iostream>
#include <list> //list的头文件
using namespace std;
/*
	函数对象的三种情况：
	  1.谓词函数--》也是函数对象的一种
		  返回值是bool，形参有一个或者二个
		形参只有一个--》一元谓词函数
			bool fun(int n)
		形参只有两个--》二元谓词函数
			bool fun(int n1,int n2)
	  2.类重载圆括号，传递类对象--》也是函数对象的一种
	  3.Lambda表达式(匿名函数)

*/

class Test
{
public:
	/*
		重载圆括号
		  1.返回值一定是bool--》为啥
				 remove_if源码中有判断条件，为true会被删除，为false不删除
		  2.形参的类型必须跟容器中存放的数据类型一致，可以定义成普通变量，也可以定义成引用
	*/
	bool operator()(int n)
	{
		cout << "参数n专门用来帮你遍历容器对象值,n的值: " << n << endl;
		if (n < 100)
			return true;
		else
			return false;
	}
};

// 自定义一元谓词函数实现--》删除小于100的元素值
bool fun(int n)
{
	cout << "参数n专门用来帮你遍历容器对象值,n的值: " << n << endl;
	if (n < 100)
		return true;
	else
		return false;

	// 简化一句话
	// return n<100;
}
int main()
{
	list<int> list1 = {12, 12, 12, 56, 96, 12, 968, 12, 745, 12};
	// 带条件的删除--》请你把list1中所有小于100的数删除
	/*
		1.思路1：自己写代码实现：for遍历list1，if(当前元素<100)  remove(删除该元素值)
		  思路2：list容器本身提供了remove_if专门负责实现带条件的删除
	*/
	// 创建Test类的对象
	// Test t1;  //t1就是函数对象
	// list1.remove_if(t1);

	// 使用一元谓词函数
	// list1.remove_if(fun);

	// 使用Lambda表达式
	list1.remove_if([](int n)
					{ return n % 2 == 1; });

	// 验证结果
	for (int x : list1)
		cout << "删除之后: " << x << endl;

	return 0;
}